/**
 * Universidade Federal de Campina Grande - UFCG
 * Departamento de Sistemas e Computação - DSC
 * Disciplina: Compiladores
 * Professor: Marcus Salerno
 * 
 * Projeto da Disciplina - Analisador Lexico
 * 
 *  
 * Contributors:
 * Arthur
 * Carolina
 * Saulo
 * 
 */
package util;

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import erro.ErroFinalArquivo;

public class ManipuladorArquivo {

	private Buffered arquivo;
	private Character esteCaracter;	
	private int linha;
	
	private static final int EOF_CHARACTER_VALUE = 65535;
	
	/**
	 * Constructor.
	 * 
	 * @param file
	 * @throws FileNotFoundException
	 */
	public ManipuladorArquivo(File file) throws FileNotFoundException {
		this.arquivo = new Buffered(new FileInputStream(file));
		this.linha = 1;			
	}
	
	
	public int getMakepos() {		
		return arquivo.getPos();
	}
	
	/**
	 * Returns the next non-empty character on source file.
	 * 
	 * @return the next non-empty character on source file
	 * @throws IOException
	 * @throws ErroFinalArquivo 
	 */
	public Character leProximoNaoVazioChar() throws IOException, ErroFinalArquivo {
		char toReturn = ' ';
		while (toReturn >= 0 && Character.isWhitespace(toReturn)) {		
			if (new Character(toReturn).toString().equals("\n")) {
				linha++;
			}
			toReturn = (char)arquivo.read();
		}		
		
		this.esteCaracter = toReturn;

		if (toReturn == Constantes.FIM_DO_ARQUIVO || !Character.isDefined(toReturn) 
				|| (int)esteCaracter >= EOF_CHARACTER_VALUE) {
			throw new EOFException(Constantes.MENSAGEM_FIM_DO_ARQUIVO);
		}
	
		return esteCaracter;
	}
	
	/**
	 * Returns the next character (can be empty).
	 * 
	 * @return O caracter lido
	 * @throws IOException 
	 * @throws ErroFinalArquivo
	 */
	public Character leProximoChar() throws ErroFinalArquivo, IOException {
	
		this.esteCaracter = (char)arquivo.read();	
				
		if (esteCaracter == null || (int)esteCaracter >= EOF_CHARACTER_VALUE ) {
			throw new ErroFinalArquivo(Constantes.MENSAGEM_FIM_DO_ARQUIVO, getLinha());
		}
			
		if (new Character(esteCaracter).toString().equals("\n")) {
			linha++;
		}
		
		return esteCaracter;		
	}

	public Character getEsteCaracter() {
		return esteCaracter;
	}

	public int getLinha() {		
		return linha;
	}

	/**
	 * Move o monteiro de leitura
	 * @param makepos
	 * @param i
	 */
	public void movePonteiro(int makepos, int i) {
		arquivo.setPos(makepos, i);
		
	}

}
